/**
 * \file service.c
 * \author Davide Gessa
 * \date 10-12-09
 */
#include <task/service.h>
#include <types.h>
#include <task/task.h>
#include <debug.h>


/**
 * Inizializza il gestore dei server
 */
void service_init()
{
	DEBUGP("service_init()\n");
	
	service_list = NULL;
}



/**
 * Restituisce il server numero x
 * 
 * \param x numero del servizio
 * \return nome del servizio x
 */
char *service_get_x(int x)
{
	int i = 0;
	service_t *m = service_list;
	
	while(m != NULL)
	{
		if(i == x) return m->name;
		
		m = m->next;
		i++;
	}
}


/**
 * Dato un server restituisce il suo nome
 * 
 * \param name nome del servizio
 * \return servizio col nome dato
 */
service_t *service_get(char *name)
{
	service_t *m = service_list;
	
	while(m != NULL)
	{
		if(strcmp(m->name, name) == 0)
			return m;
			
		m = m->next;	
	}
	return NULL;
}


/**
 * Attiva un server
 * 
 * \param service_name nome del servizio
 * \return stato dell'operazione
 */
uint8_t service_start(char *service_name)
{
	service_t *m = service_get(service_name);
	
	if(m != NULL) return SRV_NF_ER;
		
	// Avvia il server
	task_resume(m->pid);
	
	m->started = 1;
	return SRV_OK;
}


/**
 * Disattiva un server
 * 
 * \param service_name nome del servizio
 * \return stato dell'operazione
 */
uint8_t service_stop(char *service_name)
{
	service_t *m = service_get(service_name);
	
	if(m == NULL) return SRV_NF_ER;

	task_pause(m->pid);
		
	return SRV_OK;
}



/**
 * Aggiunge un server alla lista
 * 
 * \param service_name nome del servizio da aggiungere
 * \return stato dell'operazione
 */
uint8_t service_create(char *service_name)
{
	service_t *srv = (service_t *) mm_kalloc(sizeof(service_t)*2);
	
	if(srv != NULL)
	{
		strcpy(srv->name, service_name);
		srv->started = 0;
		srv->pid = task_get_pid();
		//task_pause(srv->pid);
		srv->next = service_list;
		service_list = srv;
			
		return service_start(service_name);
	}
	
	return SRV_ER;	
}




/**
 * Elimina un server
 * 
 * \param service_name nome del servizio da eliminare
 * \return stato dell'operazione
 */
uint8_t service_destroy(char *service_name)
{
	service_t *m = service_get(service_name);
	service_t *pr = service_list;
		
	if(m == NULL) return SRV_NF_ER;
	
	
	// Cerca il precedente
	if(m == service_list)
	{
		service_list = NULL;
	}
	else
	{
		while(pr != NULL && pr->next != NULL)
		{
			if(strcmp(pr->next->name, service_name) == 0) break; 
			pr = pr->next;
		}
		pr->next = m->next;
	}
	
	// Se e' caricato deinizializza
	task_kill(m->pid);
	
	// Dealloca
	mm_kfree(m);
}

